﻿using System;
using System.Data;

namespace JSClass
{
	/// <summary>
    /// JSTableModel의 요약 설명입니다.
	/// </summary>
	public class TableModel
	{
		/** 
		* 컬럼명 배열
		*/
		public String[] m_columns = null;
		/** 
		* 컬럼 개수
		*/
		public int colCount = 0;
		/** 
		* 데이터를 저장할 벡터
		*/
		protected Vector m_vector;
		/**
		* JSTableModel 객체를 생성하고 벡터를 초기화한다.
		* @param col 컬럼 개수
		*/
		public TableModel(int col)
		{
			this.initColumn(col);
			m_vector = new Vector();
		}
		/**
		* JSTableModel 객체를 생성하고 벡터를 초기화한다.
		*/
        public TableModel()
		{
            m_vector = new Vector();
		}
		/**
		* 컬럼을 초기화한다.
		* @param col 컬럼 개수
		*/
		public void initColumn(int col)
		{
			colCount = col;
			m_columns = new String[colCount];
			for (int i = 0; i < colCount; i++)
			{
				m_columns[i] = "";
			}
		}
		/**
		* 검색된 행 개수를 리턴한다.
		* @return 행 개수
		*/
		public int getRowCount()
		{
			return m_vector == null ? 0 : m_vector.size();
		}
		/**
		* 컬럼 개수를 리턴한다.
		* @return 컬럼 개수
		*/
		public int getColumnCount()
		{
			return m_columns.Length;
		}
		/**
		* 해당 컬럼명의 컬럼 번호를 리턴한다.
		* @param colName 컬럼 명
		* @return 컬럼 번호
		*/
		public int getColumnNumber(String colName)
		{
			for (int i = 0; i < this.getColumnCount(); i++)
			{
				if (colName.Equals(this.getColumnName(i)))
				{
					return i;
				}
			}
			return -1;
		}
		/**
		* 해당 컬럼 번호의 컬럼명을 리턴한다.
		* @param column 컬럼 번호
		* @return 컬럼명
		*/
		public String getColumnName(int column)
		{
			return m_columns[column];
		}
		/**
		* 컬럼의 전체 이름을 재설정한다.
		* @param columns 컬럼명 배열
		*/
		public void setColumnName(String[] columns)
		{
			if (columns.Length != colCount)
			{
				return;
			}
			m_columns = columns;
		}
		/**
		* 행당전호의 컬럼명을 재설정한다.
		* @param columnName 재설정할 컬럼명
		* @param col 컬럼번호
		*/
		public void setColumnName(String columnName, int col)
		{
			if (colCount <= col)
			{
				return;
			}
			m_columns[col] = columnName;
		}
		/**
		* 해당 행, 열 번호에 저장된 값 가져오기
		* @param nRow 삭제할 열번호
		* @param nCol 삭제할 열번호
		* @return 해당 행, 열 번호에 저장된 값
		*/
		public Object getValueAt(int nRow, int nCol)
		{
			if (nRow < 0 || nRow >= this.getRowCount())
			{
				return "";
			}
            TableData row = (TableData)m_vector.elementAt(nRow);
			return row.values[nCol]==null?"":row.values[nCol];
		}
		/**
		* 행번호, 열명으로 값 가져오기
		* @param nRow 행번호
		* @param colName 열명
		* @return 해당 행, 열명에 저장된 값
		*/
		public Object getValueAt(int nRow, String colName)
		{
			if (nRow < 0 || nRow >= this.getRowCount())
			{
				return "";
			}

			int nCol = this.getColumnNumber(colName);
			
			if(nCol == -1 )return "";

            TableData row = (TableData)m_vector.elementAt(nRow);
			return row.values[nCol]==null?"":row.values[nCol];
		}
		/**
		* 행번호로 배열로 된 열의 값 가져오기
		* @param nRow 행번호
		* @return 해당 열 번호에 저장된 값 배열
		*/
		public Object[] getValueAt(int nRow)
		{
			if (nRow < 0 || nRow >= this.getRowCount())
			{
				return null;
			}
            TableData row = (TableData)m_vector.elementAt(nRow);

			int colCount = this.getColumnCount();
			
			Object[] reObject = new Object[colCount];
			for (int i = 0; i < colCount; i++)
			{
				reObject[i] = row.values[i];
			}
			
			return reObject;
		}
		/**
		* 열번호로 마지막 row에 값 넣기
		* @param value 값
		* @param nCol 열번호
		*/
		public void setValueAt(Object value, int nCol)
		{
			int nRow = m_vector.size() - 1;

			if (nRow < 0 || nRow >= this.getRowCount())
			{
				return;
			}
            TableData row = (TableData)m_vector.elementAt(nRow);
			String svalue = value.ToString();
			row.values[nCol] = svalue;
		}
		/**
		* 행번호, 열번호로 값 넣기
		* @param value 값
		* @param nRow 행번호
		* @param nCol 열번호
		*/
		public void setValueAt(Object value, int nRow, int nCol)
		{
			if (nRow < 0 || nRow >= this.getRowCount())
			{
				return;
			}
            TableData row = (TableData)m_vector.elementAt(nRow);
			String svalue = value.ToString();
			row.values[nCol] = svalue;
		}
		/**
		* 행번호, 열명으로 값 넣기
		* @param value 값
		* @param nRow 행번호
		* @param colName 열명
		*/
		public void setValueAt(Object value, int nRow, String colName)
		{
			if (nRow < 0 || nRow >= this.getRowCount())
			{
				return;
			}

			int nCol = this.getColumnNumber(colName);
			
			if(nCol == -1 )return;

            TableData row = (TableData)m_vector.elementAt(nRow);
			String svalue = value.ToString();
			row.values[nCol] = svalue;
		}
		/**
		* 행번호에 배열로 된 열의 값 넣기
		*/
		public void setValueAt(Object[] values, int nRow)
		{
			int nCol = values.Length;
			if (nCol <= 0 || nCol > this.getColumnCount())
			{
				return;
			}
			if (nRow < 0 || nRow >= this.getRowCount())
			{
				return;
			}
            TableData row = (TableData)m_vector.elementAt(nRow);
			
			for(int i=0;i<nCol;i++){
				String svalue = values[nCol].ToString();
				row.values[nCol] = svalue;
			}
		}
		/**
		* 행을 하나 추가한다.
		*/
		public void insert()
		{
			int row = m_vector.size();
            m_vector.insertElementAt(new TableData(colCount), row);
		}
		/**
		* 해당 열번호의 데이터를 삭제한다.
		* @param row 삭제할 열번호
		* @return 삭제 여부
		*/
		public bool delete(int row)
		{
			if (row < 0 || row >= m_vector.size())
				return false;
			m_vector.remove(row);
			return true;
		}
	}
}